package com.academy.services;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

import android.net.http.AndroidHttpClient;

public class RestClient 
{
	 private ArrayList <NameValuePair> params;
	 private ArrayList <NameValuePair> headers;
	   /**
	    * This class is used for framing url and execute the request
	    */
	    private String url;	 
	    private int responseCode;
	    private String message;	 
	    private String response;
	  
	    public String getResponse() 
	    {
	        return response;
	    }
	 
	    public String getErrorMessage() 
	    {
	        return message;
	    }
	 
	    public int getResponseCode()
	    {
	        return responseCode;
	    }
	 
	    public RestClient(String url) 
	    {
	        this.url = url;
	        params = new ArrayList<NameValuePair>();
	        headers = new ArrayList<NameValuePair>();
	    }
	 
	    public void AddParam(String name, String value)
	    {
	        params.add(new BasicNameValuePair(name, value));
	    }
	    
	    public void AddParam1(String name)
	    {
	        params.add(new BasicNameValuePair(name, null));
	    }
	    
	 
	    public void AddHeader(String name, String value)
	    {
	        headers.add(new BasicNameValuePair(name, value));
	    }
	    /**
	     * Here we frame the request with the given headers and parameters.
	     * The request is gets execute with the given http method.
	     * After framing url we invoke the executeRequest().
	     */
	    public void Execute(RequestMethod method) throws Exception
	    {
	        switch(method) 
	        {
	            case GET:
	            {
	                String combinedParams = "";
	                if(!params.isEmpty())
	                {
	                	System.out.println("Params:"+params);
	                    combinedParams += "?";
	                    for(NameValuePair p : params)
	                    {
	                        String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),"UTF-8");
	                        if(combinedParams.length() > 1)
	                        {
	                            combinedParams  +=  "&" + paramString;
	                        }
	                        else
	                        {
	                            combinedParams += paramString;
	                        }
	                    }
	                }
	                System.out.println("Request Url String:"+url+combinedParams);
	                HttpGet request = new HttpGet(url + combinedParams);	               
	              //add Headres
	                
	                for(NameValuePair h : headers)
	                {
	                    request.addHeader(h.getName(), h.getValue());
	                }
	                executeRequest(request, url);
	                break;
	            }
	            case POST:
	            {
	                HttpPost request = new HttpPost(url);
	                
	                for(NameValuePair h : headers)
	                {
	                    request.addHeader(h.getName(), h.getValue());
	                }
	                if(!params.isEmpty())
	                {
	                	System.out.println("Params:"+params);
	                    request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
	                }	
	                executeRequest(request, url);
	                break;
	            }
	        }
	    }		    
	 
	    private void executeRequest(HttpUriRequest request, String url)
	    {
	    	System.out.println("request & response:"+request+"...."+url);
	        HttpClient client= new DefaultHttpClient();
	      
	    	HttpResponse httpResponse;
//		        HttpContext localContext = new BasicHttpContext();
	        try 
	        {		
	        
	        	
	        	 httpResponse = client.execute(request); //,localContext);
    	      	 
	        	 responseCode = httpResponse.getStatusLine().getStatusCode();
	             message = httpResponse.getStatusLine().getReasonPhrase();
	            
				 HttpEntity entity = httpResponse.getEntity();  
				
				 if (entity != null)
				 {						 
		                InputStream instream = entity.getContent();
		                response = convertStreamToString(instream);
		                System.out.println("Response in rest client:"+response);
		                // Closing the input stream will trigger connection release
		                instream.close();
		         }
	        } 
	        catch (ClientProtocolException e) 
	        {	            
	            //*8
	        	
	        	client.getConnectionManager().shutdown();
	        	e.printStackTrace();   
	        } 
	        catch (IOException e) 
	        {
	            e.printStackTrace();
	        }
	    } 
	    
	    //**  convertStream

	    private static String convertStreamToString(InputStream is)
	    {		    	 
	        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
	        StringBuilder sb = new StringBuilder();
	 
	        String line = null;
	        try 
	        {
	            while ((line = reader.readLine()) != null)
	            {
	                sb.append(line + "\n");
	            }
	        } 
	        catch (IOException e) 
	        {
	            e.printStackTrace();
	        }
	        finally 
	        {
	            try 
	            {
	                is.close();
	            } catch (IOException e) 
	            {
	                e.printStackTrace();
	            }
	        }
	        return sb.toString();
	    }
}

